# 1. Resource Hints

# 1.1. 预解析

第一步:首先打开DNS预解析

<meta http-equiv="x-dns-prefetch-control" content="on">

第二步:手动添加解析

<link rel="dns-prefetch" href="//www.img.com">

这样之后用户的某个动作,触发了 www.img.com 域名下的远程请求时,就避免了 DNS 解析的步骤。

使用场景:

  • 静态资源域名(如CDN)
  • 未来即将会发生跳转的域名
  • 会重定向的域名

注意事项:

  • 浏览器并不保证一定会去解析域名,可能会根据当前的网络、负载等状况做决定
  • Chrome会使用了8个异步线程来处理DNS预解析,所以过多的 prefetch 并不一定能提高网页加载效率

# 1.2. 预连接

preconnect 会触发DNS预解析

建立连接需要 TCP 协议握手,有些还会有 TLS/SSL 协议,这些都会导致连接的耗时。使用 Preconnect 可以帮助你告诉浏览器:“我有一些资源会用到某个源(origin),你可以帮我预先建立连接。

<link rel="preconnect" href="//example.com">
<link rel="preconnect" href="//cdn.example.com" crossorigin>

# 1.3. 预加载

# 1.3.1. Prefetch

可以用 Prefetch 来指定在紧接着之后的操作或浏览中需要使用到的资源,让浏览器在空闲时提前获取。由于仅仅是提前获取资源,因此浏览器不会对资源进行预处理,实际使用中效果也很好。 示例:

第一步:在使用React做懒加载时,可借助Webpack指定Prefetch

const Game = lazy(() => import(/* webpackPrefetch: true */ './game'));

第二步:此时你会发现对应的Chunk被加上了Prefetch标识

<link rel="prefetch" as="script" href="/static/js/6.f0a869f6.chunk.js">

第三步:此时访问到对应页面时会发现响应头状态码带上了缓存标识

Request Method: GET
Status Code: 200 OK (from **prefetch cache**)

# 1.3.2. Preload

错误的设置会导致阻塞页面加载,通常可以对字体资源设置preload,来避免无样式文本 (FOUT) 闪烁的情况 在遇到需要 Preload 的资源时,浏览器会 立刻 进行预获取,并将结果放在内存中,资源的获取不会影响页面 parse 与 load 事件的触发。

<link rel="preload" href="./nextpage.js" as="script">

# 1.3.3. Prerender

如果你指定 Prerender 一个页面,那么它依赖的其他资源,像